import java.util.Arrays;
import java.util.Random;

public class Test1 {

    //顺序
    public static void order(int[] arr) {
        for(int i=0;i<arr.length;i++) {
            arr[i]=i;
        }
    }

    //逆序
    public static void notOrder(int[] arr) {
        for(int i=0;i<arr.length;i++) {
            arr[i]=arr.length-i;
        }
    }

    //随机顺序
    public static void randomOrder(int[] arr) {
        Random rand=new  Random();
        for(int i=0;i<arr.length;i++) {
            arr[i]=rand.nextInt(10_000);
        }
    }

    public static void testInsertSort(int[] arr) {
        /*
        每次排序的对象是准备好的数组的备份.这样既保证了同一数据源,也不会相互影响
         */
        arr= Arrays.copyOf(arr, arr.length);
        long startTime=System.currentTimeMillis();//获取系统的毫秒时间戳
        TestSort1.insertSort(arr);
        long endTime=System.currentTimeMillis();
        System.out.println("插入排序耗时:"+(endTime-startTime)+"ms");
    }
    public static void testShellSort(int[] arr) {
        /*
        每次排序的对象是准备好的数组的备份.这样既保证了同一数据源,也不会相互影响
         */
        arr= Arrays.copyOf(arr, arr.length);
        long startTime=System.currentTimeMillis();//获取系统的毫秒时间戳
        TestSort1.shellSort(arr);
        long endTime=System.currentTimeMillis();
        System.out.println("希尔排序耗时:"+(endTime-startTime)+"ms");
    }
    public static void testSelectSort(int[] arr) {
        /*
        每次排序的对象是准备好的数组的备份.这样既保证了同一数据源,也不会相互影响
         */
        arr= Arrays.copyOf(arr, arr.length);
        long startTime=System.currentTimeMillis();//获取系统的毫秒时间戳
        TestSort1.selectSort1(arr);
        long endTime=System.currentTimeMillis();
        System.out.println("选择排序耗时:"+(endTime-startTime)+"ms");
    }
    public static void testHeapSort(int[] arr) {
        /*
        每次排序的对象是准备好的数组的备份.这样既保证了同一数据源,也不会相互影响
         */
        arr= Arrays.copyOf(arr, arr.length);
        long startTime=System.currentTimeMillis();//获取系统的毫秒时间戳
        TestSort1.heapSort(arr);
        long endTime=System.currentTimeMillis();
        System.out.println("堆排序耗时:"+(endTime-startTime)+"ms");
    }
    public static void testBubbleSort(int[] arr) {
        /*
        每次排序的对象是准备好的数组的备份.这样既保证了同一数据源,也不会相互影响
         */
        arr= Arrays.copyOf(arr, arr.length);
        long startTime=System.currentTimeMillis();//获取系统的毫秒时间戳
        TestSort1.bubbleSort(arr);
        long endTime=System.currentTimeMillis();
        System.out.println("冒泡排序耗时:"+(endTime-startTime)+"ms");
    }
    public static void testQuickSort(int[] arr) {
        /*
        每次排序的对象是准备好的数组的备份.这样既保证了同一数据源,也不会相互影响
         */
        arr= Arrays.copyOf(arr, arr.length);
        long startTime=System.currentTimeMillis();//获取系统的毫秒时间戳
        TestSort1.quickSort(arr);
        long endTime=System.currentTimeMillis();
        System.out.println("快速排序耗时:"+(endTime-startTime)+"ms");
    }
    public static void testMergeSort(int[] arr) {
        /*
        每次排序的对象是准备好的数组的备份.这样既保证了同一数据源,也不会相互影响
         */
        arr= Arrays.copyOf(arr, arr.length);
        long startTime=System.currentTimeMillis();//获取系统的毫秒时间戳
        TestSort1.mergeSort(arr);
        long endTime=System.currentTimeMillis();
        System.out.println("归并排序耗时:"+(endTime-startTime)+"ms");
    }

    public static void main2(String[] args) {
        int[] array=new int[10_0000];
        randomOrder(array);
//        testInsertSort(array);
//        testShellSort(array);
//        testSelectSort(array);
        testHeapSort(array);
//        testBubbleSort(array);
        testQuickSort(array);
        testMergeSort(array);
    }

    public static void main(String[] args) {
        TestSort1 test=new TestSort1();
//        int[] arr={200,67,2,80,13,44,100};
//        int[] arr={1,2,3,4,5,6,7,8,9};
        int[] arr={9,2,7,3,5,1,6,4,8};
//        TestSort1.insertSort(arr);
//        TestSort1.shellSort(arr);
//        TestSort1.selectSort1(arr);
//        TestSort1.selectSort2(arr);
//        TestSort1.heapSort(arr);
//        TestSort1.bubbleSort(arr);
//        TestSort1.quickSortNot(arr);
//        TestSort1.quickSortNot(arr);
//        TestSort1.quickSortNot(arr);
//        TestSort1.mergeSort(arr);
//        TestSort1.mergeSortNot(arr);
        TestSort1.countSort(arr);

        for(int i:arr) {
            System.out.print(i+" ");
        }
    }
}
